export const devPublic = {
  data() {
    return {
      text1: '### 概述\n' +
          '\n' +
          '1. #### 工作空间\n' +
          '\n' +
          '   `作空间是用户的工作环境，用于保存用户的工作环境和工作过程中操作和处理的所有数据，包括数据源、地图配置、三维场景配置、图层属性等内容`\n' +
          '\n' +
          '2. #### 工程文件\n' +
          '\n' +
          '   `工程文件是工作空间的具体存储结构，具体表现形式是一个扩展名为.evproj的文件。工程文件由工程文件管理器CProjectManager进行管理`\n' +
          '\n' +
          '3. #### 场景\n' +
          '\n' +
          '   `场景既三维数字地球场景，是一套场景配置的集合，场景配置通常包含场景属性、三维图层配置等`\n' +
          '\n' +
          '4. #### 地图\n' +
          '\n' +
          '   `场景既二维地图，是一套地图配置的集合，地图配置通常包含地图属性、二维图层配置等`\n' +
          '\n' +
          '5. #### 地图布局\n' +
          '\n' +
          '   `地图布局既地图打印布局，是一套地图打印配置的集合，地图布局通常包含一个地图、打印元素、打印属性设置等`\n' +
          '\n' +
          '6. #### 抽象工厂设计模式\n' +
          '\n' +
          '   `对于数据源、数据集、图层这类有扩展性需求的模块来说，我们采用抽象工厂设计模式。同时，数据源、数据集和图层的类型标识采用的是字符串而不是枚举，以保证类型的可扩展性`\n' +
          '\n' +
          '7. #### 属性键值对\n' +
          '\n' +
          '   `为了屏蔽输入参数的差异性，统一接口，引入了属性键值对对象。键值对一般来说键都是字符串，这就带来一个问题，二次开发用户需要记忆每一个键的字符串，以及这个字符串所对应的属性的类型。因此我们引入了CPropertyKey对象用以代替字符串，CPropertyKey可以让用户像使用枚举一样使用键，其内部还可以添加一些描述信息。`\n' +
          '\n' +
          '   ```javascript\n' +
          '   键具有可扩展性，用户也可以从CPropertyKey扩展自己的键。\n' +
          '   头文件： "spatialinterface/ipropertyset.h"\n' +
          '   命名空间：EarthView::World::Spatial::GeoDataset;\n' +
          '   类型： CPropertySet、CPropertyKey，以及从CPropertyKey派生的内置键类型\n' +
          '   举例： CPropertySet info;\n' +
          '   info.setProperty(CFileSystemPropertyKey::Directory(), dir);\n' +
          '   扩展：\n' +
          '   class MyPropertyKey : public CPropertyKey{\n' +
          '   public:\n' +
          '   /// <summary>\n' +
          '   /// Key = "Directory";\n' +
          '   /// 文件夹路径，必须是绝对路径\n' +
          '   /// </summary>\n' +
          '   static CPropertyKey Length() {\n' +
          '   return CPropertyKey("Length ", "长度", "整形数值表示的长度");\n' +
          '   }\n' +
          '   };\n' +
          '   //这样使用扩展的类型：\n' +
          '   CPropertySet info;\n' +
          '   info.setProperty(MyPropertyKey::Length(), 100);\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '\n',

      text2:'### 工程文件\n' +
          '\n' +
          '1. #### 场景管理\n' +
          '\n' +
          '   三维数字地球场景是以一个界面窗口为载体呈现在用户面前的。相关的核心类包括\n' +
          '\n' +
          '   ```\n' +
          '   IScene：一个抽象的场景，可以通过它获取场景管理器\n' +
          '   CGeoSceneManager：场景管理器，一个场景的大部分操作都由场景管理器完成。\n' +
          '   CGlobeControl：一个抽象场景控件，通过它与界面窗口进行关联。\n' +
          '   GlobeWidget：Qt场景控件\n' +
          '   ```\n' +
          '\n' +
          '   `本章主要介绍工程文件管理器中场景管理的相关操作：获取场景；创建和销毁场景；打开和关闭场景。我们推荐的创建销毁场景的方式不是通过场景工厂，而是通过工程文件管理器，通过工程文件管理器添加的场景会同步显示在图层树上`\n' +
          '\n' +
          '1.1 **获取场景**\n' +
          '\n' +
          '```javascript\n' +
          '//通过场景名称获取场景。\n' +
          'IScene *scene = CProjectManager::getSingletonPtr()->getScene("我的场景");\n' +
          '//获取场景数量。\n' +
          'ev_uint32 count = CProjectManager::getSingletonPtr()->getSceneCount();\n' +
          '//通过场景序号获取场景。\n' +
          'scene = CProjectManager::getSingletonPtr()->getScene(0);\n' +
          '//获取场景管理器。\n' +
          'CGeoSceneManager *sceneMnger = dynamic_cast<CScene *>(scene)-> getGeoSceneManager();\n' +
          '```\n' +
          '\n' +
          '1.2 **创建和销毁场景 **\n' +
          '\n' +
          '首先，必须保证按照3.4场景工厂章节所述，给工程文件管理器注册场景工厂。然后才能执行如下操作：\n' +
          '\n' +
          '```javascript\n' +
          '//创建和添加场景到工程文件管理器。\n' +
          'IScene *scene = CProjectManager::getSingletonPtr()->createAndAddScene("我的场景", STT_WEBMERCATOR);\n' +
          '//移除和销毁场景。\n' +
          'CProjectManager::getSingletonPtr()->removeAndDestroyScene("我的场景");\n' +
          '```\n' +
          '\n' +
          '1.2 **打开和关闭场景**\n' +
          '\n' +
          '```javascript\n' +
          '打开场景，是一个界面相关的操作。以Windows平台、QT界面为例，需要将QT的窗口句柄格式化为字符串windowHandle，作为"externalWindowHandle"参数传递给CGlobeControlManager::createGlobeControl。\n' +
          '相关类名：CGlobeControlManager\n' +
          'CGlobeControl\n' +
          '头文件：globecontrol/globecontrolmanager.h\n' +
          'globecontrol/globecontrol.h\n' +
          '命名空间：EarthView::World::Spatial3D:: Controls;\n' +
          '示例代码：\n' +
          '//从QWidget派生出QT场景窗口，详细实现过程可参见globewidget\\src\\internalwidget.cpp\n' +
          'class CInternalWidget : public QWidget {\n' +
          'Q_OBJECT\n' +
          'public:\n' +
          'explicit CInternalWidget(QWidget *parent):QWidget(parent, Qt::MSWindowsOwnDC){\n' +
          'setAttribute(Qt::WA_PaintOnScreen);\n' +
          'setAttribute(Qt::WA_NoSystemBackground);\n' +
          'setAttribute(Qt::WA_OpaquePaintEvent);\n' +
          'setAutoFillBackground(true);\n' +
          'setMouseTracking(true);\n' +
          'setAcceptDrops(true);\n' +
          'setFocusPolicy(Qt::StrongFocus);\n' +
          'setAttribute(Qt::WA_AcceptTouchEvents);\n' +
          '}\n' +
          'virtual ~CInternalWidget(){}\n' +
          '...\n' +
          '};\n' +
          '// 通过windowHandle关联窗口和场景\n' +
          'EVString windowHandle = widgetInternal->winId();\n' +
          '//打开场景。\n' +
          'EarthView::World::Core::NameValuePairList miscParams;\n' +
          'miscParams.push("externalWindowHandle", windowHandle);\n' +
          'miscParams.push("left","0");\n' +
          'miscParams.push("top","0");\n' +
          'miscParams.push("border","none");\n' +
          'miscParams.push("FSAA", CRoot::getSingleton().getRenderSystem()->getConfigOptions()["FSAA"].currentValue);\n' +
          'miscParams.push("vsync", CRoot::getSingleton().getRenderSystem()->getConfigOptions()["VSync"].currentValue);\n' +
          'miscParams.push("vsyncInterval", CRoot::getSingleton().getRenderSystem()->getConfigOptions()["VSync Interval"].currentValue);\n' +
          'CGlobeControl* ctrl = CGlobeControlManager::getSingletonPtr()->createGlobeControl("我的场景", 800, 600, &miscParams);\n' +
          'IScene* scene = CProjectManager::getSingleton().getScene("我的场景");\n' +
          'ctrl->setScene(scene);\n' +
          'scene->setActive(true);\n' +
          '//关闭场景。\n' +
          'CGlobeControlManager::getSingletonPtr()->removeGlobeControl("我的场景");\n' +
          'scene->setActive(false);\n' +
          '```\n' +
          '\n' +
          '\n' +
          '\n' +
          '2. #### 地图管理\n' +
          '\n' +
          '   地图既二维地图，以一个界面窗口为载体呈现在用户面前。相关的核心类包括\n' +
          '\n' +
          '   ```\n' +
          '   IMap：一个抽象的地图\n' +
          '   CMapControl：一个抽象地图控件，通过它与界面窗口进行关联。\n' +
          '   MapWidget：Qt地图控件\n' +
          '   ```\n' +
          '\n' +
          '   `本章主要介绍工程文件管理器中地图管理的相关操作：获取地图；创建和销毁地图；打开和关闭地图。我们推荐的创建销毁地图的方式不是通过地图工厂，而是通过工程文件管理器，通过工程文件管理器添加的地图会同步显示在图层树上`\n' +
          '\n' +
          '   2.1 **获取地图**\n' +
          '\n' +
          '   ```javascript\n' +
          '   \n' +
          '   //通过地图名称获取地图。\n' +
          '   IMap *map = CProjectManager::getSingletonPtr()->getMap("我的地图");\n' +
          '   //获取地图数量。\n' +
          '   ev_uint32 count = CProjectManager::getSingletonPtr()->getMapCount();\n' +
          '   //通过地图序号获取地图。\n' +
          '   map = CProjectManager::getSingletonPtr()->getMap(0);\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '   2.2 **创建和销毁地图**\n' +
          '\n' +
          '   ```javascript\n' +
          '   首先，必须保证按照3.5地图工厂章节所述，给工程文件管理器注册地图工厂。然后才能执行如下操作：\n' +
          '   //创建和添加地图到工程文件管理器。\n' +
          '   IMap *map = CProjectManager::getSingletonPtr()->createAndAddMap("我的地图");\n' +
          '   //移除和销毁地图。\n' +
          '   CProjectManager::getSingletonPtr()->removeAndDestroyMap("我的地图");\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '   2.3 **打开和关闭地图**\n' +
          '\n' +
          '   ```javascript\n' +
          '   打开地图，是一个界面相关的操作。以QT为例，Qt地图窗口需要从CMapControlAgent派生，构造出CMapControl之后，需要通过CMapControl::setProxy方法把Qt窗口设置给CMapControl。\n' +
          '   相关类名：CMapControlAgent\n' +
          '   CMapControl\n' +
          '   头文件： mapcontrol/mapcontrol.h\n' +
          '   命名空间：EarthView::World::Spatial2D:: Controls;\n' +
          '   示例代码：\n' +
          '   //从QWidget和CMapControlAgent派生出QT地图窗口，详细实现过程可参见mapwidget/src/internalmapwidget.cpp\n' +
          '   class InternalMapWidget : public QWidget, public CMapControlAgent{\n' +
          '   Q_OBJECT\n' +
          '   public:\n' +
          '   InternalMapWidget(CMapControl *control, QWidget *parent): QWidget(parent) {\n' +
          '   setFocusPolicy( Qt::StrongFocus );\n' +
          '   setMouseTracking( true );\n' +
          '   //关联窗口和地图\n' +
          '   control-> setProxy(this);\n' +
          '   }\n' +
          '   ~InternalMapWidget(){}\n' +
          '   void paintEvent( QPaintEvent* event ){\n' +
          '   ...\n' +
          '   }\n' +
          '   void resizeEvent( QResizeEvent *event ){\n' +
          '   ...\n' +
          '   }\n' +
          '   ...\n' +
          '   };\n' +
          '   //打开地图。\n' +
          '   CMapControl* ctrl = new CMapControl;\n' +
          '   IMap* map = CProjectManager::getSingleton().getMap("我的地图");\n' +
          '   ctrl->setMap(map);\n' +
          '   map->setActive(true);\n' +
          '   InternalMapWidget *internalWidget = new InternalMapWidget(ctrl, parentWidget);\n' +
          '   //关闭地图。\n' +
          '   delete internalWidget;\n' +
          '   delete ctrl;\n' +
          '   ```\n' +
          '\n' +
          '   ',
      text3:'1. #### 数据筛选\n' +
          '\n' +
          '    图层组下能添加哪些类型的数据是确定的，但是由于图层和数据集的结构比较松散，并没有一个直接的对应关系表。我们在数据集和图层的设计中考虑了这个问题：   在数据集工厂中增加了根据父图层组和数据集的元数据信息（可为空）获取该数据所匹配的图层类型的方法：\n' +
          '\n' +
          '   ```javascript\n' +
          '   virtual EVLayerType IDatasetFactory::getCorrespondingLayerType(ILayer *parent, IDataMetaInfo *info);\n' +
          '   在图层中增加了判断该图层是否能添加到给定的父图层中去的方法：\n' +
          '   virtual ev_bool ILayer::checkParentType(const EVLayerType &type);\n' +
          '   在实现具体的数据集工厂和图层时，重写这两个方法，这样就可以通过如下代码逻辑，判断出某个图层组下面到底能添加哪些类型的数据：\n' +
          '   EVDatasetTypeSet getSupportedType(EVLayerType grouplayerType){\n' +
          '   EVDatasetTypeSet types;\n' +
          '   vector<EVLayerType> fitLayerTypes;\n' +
          '   ILayerFactory *parentFactory = CLayerFactoryEnumerator::getSingletonPtr()->getLayerFactory(grouplayerType);\n' +
          '   ILayer *parent = NULL;\n' +
          '   if (parentFactory){\n' +
          '   parent = parentFactory->create();\n' +
          '   if (parent) {\n' +
          '   LayerFactoryList factories = CLayerFactoryEnumerator::getSingletonPtr()-> getFactorys();\n' +
          '   for (ev_int32 i = 0; i < factories.size(); i++){\n' +
          '   ILayerFactory *factory = factories.at(i);\n' +
          '   ILayer *child = factory->create();\n' +
          '   if (child->checkParentType(parent->getType())){\n' +
          '   fitLayerTypes.push_back(child->getType());\n' +
          '   }\n' +
          '   delete child;\n' +
          '   }\n' +
          '   }\n' +
          '   }\n' +
          '   if (fitLayerTypes.size() > 0) {\n' +
          '   DataSourceFactoryList dsFactories = CDataSourceFactoryEnumerator::getSingletonPtr()-> getFactorys();\n' +
          '   for (ev_int32 i = 0; i < dsFactories.size(); i++){\n' +
          '   DatasetFactoryList factories = dsFactories.at(i)->getDatasetFactoryEnumerator()-> getFactorys();\n' +
          '   for (ev_int32 j = 0; j < factories.size(); j++){\n' +
          '   IDatasetFactory *factory = factories.at(j);\n' +
          '   for (vector<EVLayerType>::iterator it = fitLayerTypes.begin(); it != fitLayerTypes.end();it++){\n' +
          '   if (factory->checkLayerType(parent, *it)) {\n' +
          '   types.insert(factory->Type);\n' +
          '   }\n' +
          '   }\n' +
          '   }\n' +
          '   }\n' +
          '   }\n' +
          '   if (parent) {\n' +
          '   delete parent;\n' +
          '   }\n' +
          '   return types;\n' +
          '   }\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '2. ### 移动图层\n' +
          '\n' +
          '   ```javascript\n' +
          '   // ISpatialDocument是IMap和IScene的基类，移动地图和场景的图层都可以通过这个方法。其中fromlayer为将要移动的图层当前所在图层组，oldIndex是该图层在原图层组中的序号，tolayer为需要移动到的目标图层组，newIndex是目标图层组中的序号\n' +
          '   void ISpatialDocument：：moveLayer(ILayer* fromlayer, ev_uint32 oldIndex, ILayer* tolayer, ev_uint32 newIndex);\n' +
          '   ```\n' +
          '\n' +
          '   ',
      text4:'1. #### 数据源\n' +
          '\n' +
          '   (1).数据源是存储空间数据和三维场景数据的场所。所有的空间和三维场景数据都存储于数据源而不是工作空间，任何对空间数据或三维场景数据的操作都需要先获得并且打开数据源。   \n' +
          '\n' +
          '   (2).数据源按照不同的空间数据引擎分为三大类：基于文件引擎的数据源、基于数据库引擎的数据源、基于Web引擎的数据源。   \n' +
          '\n' +
          '   (3).一个工作空间中可以打开多个数据源，各种数据源通过不同的别名进行标识。  \n' +
          '\n' +
          '    (4).数据集是 EV-Globe SDK数据的基本组织单位之一。一个数据源通常由一个或多个不同类型的数据集组成，同时数据集也是图层的数据来源。\n' +
          '\n' +
          '   下表展示数据源和数据集的从属关系\n' +
          '\n' +
          '|                       **空间数据引擎**                       | **数据源类型**                                               | **数据集类型**                                               |\n' +
          '| :----------------------------------------------------------: | ------------------------------------------------------------ | ------------------------------------------------------------ |\n' +
          '|                 文件引擎<br/>（基于文件IO）                  | 文件数据源<br/>EVDataSourceType::DST_FILESYSTEM()            | KML数据集<br/>文件矢量数据集<br/>栅格数据集<br/>海图数据集<br/>影像缓存数据集<br/>DEM缓存数据集<br/>LOD模型数据集<br/>OBQ倾斜摄影模型数据集<br/>OSGB倾斜摄影模型数据集<br/>街景数据集<br/>点云数据集<br/> |\n' +
          '| 数据库引擎<br/>（基于数据库驱动，支持的数据库驱动包含：<br/>OCI、ODBC、Sqlite、PostGis） | 数据库数据源<br/>EVDataSourceType::DST_DATABASE()            | 点数据集<br/>线数据集<br/>线数据集<br/>网络数据集<br/>标注数据集<br/>点数据集<br/>栅格数据集<br/>模型数据集<br/>Instance模型数据集<br/>特效数据集<br/> |\n' +
          '|                Web引擎<br/>（基于Http/Https)                 | EarthView空间服务数据源<br/>EVDataSourceType::<br/>DST_WEBSERVER_EARTHVIEW_SERVER() | EarthView WMTS影像数据集<br/>EarthView DEM数据集<br/>EarthView WMS数据集<br/>EarthView WFS数据集<br/>EarthView模型数据集<br/>KML数据集<br/>EarthView Instance模型数据集<br/>EarthView海图数据集<br/>EarthView栅格数据集<br/>EarthView LOD模型数据集<br/>EarthView OBQ倾斜摄影模型数据集<br/>EarthView OSGB倾斜摄影模型数据集<br/>EarthView 点云数据集<br/>EarthView 街景数据集<br/>EarthView 街景数据集<br/>EarthView 三维测量分析服务<br/> |\n' +
          '|                Web引擎<br/>（基于Http/Https)                 | OGC WMS服务数据源<br/>EVDataSourceType::DST_WEBSERVER_OGC_WMS() | OGC WMS数据集                                                |\n' +
          '|                Web引擎<br/>（基于Http/Https)                 | OGC WMTS服务数据源<br/>EVDataSourceType::DST_WEBSERVER_OGC_WMTS () | OGC WMTS数据集                                               |\n' +
          '|                Web引擎<br/>（基于Http/Https)                 | OGC WFS服务数据源<br/>EVDataSourceType::DST_WEBSERVER_OGC_WFS () | OGC WFS数据集                                                |\n' +
          '|                Web引擎<br/>（基于Http/Https)                 | SDE服务器上的DEM数据源<br/>EVDataSourceType::DST_SDEDEM_SERVER()<br/>（一般为内部使用，用户不需要关心） | EarthView SDE服务器上的DEM数据集                             |\n' +
          '\n' +
          '\n' +
          '\n' +
          '\n',
      text5:'1. #### 数据源工厂\n' +
          '\n' +
          '   ```c++\n' +
          '   头文件： " spatialinterface/idatasourcefactory.h"\n' +
          '   命名空间：EarthView::World::Spatial::GeoDataset;\n' +
          '   类型： IDataSourceFactory\n' +
          '   举例：\n' +
          '   //从数据源工厂枚举可以获取到所有注册到系统中的数据源工厂对象：\n' +
          '   DataSourceFactoryList factories = CDataSourceFactoryEnumerator::getSingletonPtr()->getFactorys();\n' +
          '   //也可通过数据源类型获取相应的数据源工厂：\n' +
          '   IDataSourceFactory *factory = CDataSourceFactoryEnumerator::getSingletonPtr()->\n' +
          '   getDataSourceFactory (EVDataSourceType::DST_DATABASE());\n' +
          '   扩展：\n' +
          '   class MyDataSourceFactory : public EarthView::World::Spatial::GeoDataset::IDataSourceFactory{\n' +
          '   ev_internal:\n' +
          '   /// <summary>\n' +
          '   /// 创建数据源对象\n' +
          '   /// </summary>\n' +
          '   /// <returns>数据源对象</returns>\n' +
          '   virtual EarthView::World::Spatial::GeoDataset::IDataSource* createImpl() {\n' +
          '   return new MyDataSource();\n' +
          '   }\n' +
          '   protected:\n' +
          '   /// <summary>\n' +
          '   /// 默认构造函数\n' +
          '   /// </summary>\n' +
          '   /// <returns> </returns>\n' +
          '   MyDataSourceFactory(const EVDataSourceType& type, const EVString& name, const EVString& description): IDataSourceFactory(EVDataSourceType::DST_MYTYPE(), "我新扩展的数据源", "一种我新扩展的，用来存储有用 数据的数据源"){}\n' +
          '   };\n' +
          '   //自动向系统注册这种新数据源工厂（在.cpp中添加代码）：\n' +
          '   class CMyDataSourceFactoryRegistor{\n' +
          '   public:\n' +
          '   CMyDataSourceFactoryRegistor (){\n' +
          '   CDataSourceFactoryEnumerator::getSingletonPtr()->addDataSourceFactory(new MyDataSourceFactory());\n' +
          '   }\n' +
          '   ~ CMyDataSourceFactoryRegistor (){\n' +
          '   CDataSourceFactoryEnumerator::getSingletonPtr()->removeDataSourceFactory(MyDataSourceType:: DST_MYTYPE());\n' +
          '   }\n' +
          '   };\n' +
          '   CMyDataSourceFactoryRegistor gMyDataSourceFactoryRegistor;\n' +
          '   //使用工厂创建数据源：\n' +
          '   CPropertySet info;\n' +
          '   info.setProperty(CDataBasePropertyKey::FullPath(), path + "sample.evd");\n' +
          '   info.setProperty(CDataBasePropertyKey::DatabaseName(), "sample.evd");\n' +
          '   info.setProperty(CDataBasePropertyKey::DatabaseType(), EVDatabaseType::SQLITE().Str);\n' +
          '   info.setProperty(CDataBasePropertyKey::Driver(), EVDatabaseType::SQLITE().Str);\n' +
          '   IDataSource *ds = factory-> create("sample.evd", &info);//factory为数据库数据源工厂\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '2. #### 数据集工厂\n' +
          '\n' +
          '   ```c++\n' +
          '   头文件： " spatialinterface/idatasetfactory.h"\n' +
          '   命名空间：EarthView::World::Spatial::GeoDataset;\n' +
          '   类型：IDatasetFactory\n' +
          '   举例：\n' +
          '   //从数据源工厂可以获得属于该数据源的所有数据集工厂：\n' +
          '   DatasetFactoryList factories = CDataSourceFactoryEnumerator:: getSingletonPtr()->getDataSourceFactory (EVDataSourceType:: DST_DATABASE())->getDatasetFactoryEnumerator()->getFactorys();\n' +
          '   //也可通过数据源类型获取相应的数据集工厂：\n' +
          '   IDatasetFactory *factory = CDataSourceFactoryEnumerator:: getSingletonPtr()->getDataSourceFactory (EVDataSourceType:: DST_DATABASE())->getDatasetFactoryEnumerator()->getDatasetFactory (EVDatasetType:: DT_VECTOR_FEATURECLASS());\n' +
          '   扩展：\n' +
          '   class MyDatasetFactory : public EarthView::World::Spatial::GeoDataset::IDatasetFactory{\n' +
          '   public:\n' +
          '   virtual EarthView::World::Spatial::Atlas::EVLayerType getCorrespondingLayerType(EarthView::World::Spatial::Atlas::ILayer *parent, EarthView::World::Spatial::GeoDataset::IDataMetaInfo *info){\n' +
          '   if (parent->getType() == EVLayerType::LT_FeatureGroupLayer()){\n' +
          '   return MyLayerType::LT_MyLayer();\n' +
          '   }\n' +
          '   }\n' +
          '   virtual _extfree EarthView::World::Spatial::GeoDataset::IDataMetaInfos* getDatasetInfos(EarthView::World::Spatial::GeoDataset::IDataSource *parent){\n' +
          '   // 在这里读取数据集的元数据信息，new一个CDataMetaInfo，设置参数，并返回。\n' +
          '   }\n' +
          '   ev_internal:\n' +
          '   /// <summary>\n' +
          '   /// 创建物理数据集的具体实现\n' +
          '   /// </summary>\n' +
          '   /// <returns>成功返回true,失败返回false</returns>\n' +
          '   virtual ev_bool createImpl(EarthView::World::Spatial::GeoDataset::IDataSource *parent, const EVString &name, EarthView::World::Spatial::GeoDataset::IPropertySet *info){\n' +
          '   // 在这里根据输入的参数创建数据集的物理存储结构\n' +
          '   }\n' +
          '   /// <summary>\n' +
          '   /// 销毁数据集\n' +
          '   /// </summary>\n' +
          '   /// <returns></returns>\n' +
          '   virtual ev_bool destroyImpl(EarthView::World::Spatial::GeoDataset::IDataSource *parent, const EVString &name){\n' +
          '   // 在这里销毁数据集的物理存储结构\n' +
          '   }\n' +
          '   /// <summary>\n' +
          '   /// 打开逻辑数据集\n' +
          '   /// </summary>\n' +
          '   /// <returns>数据集对象</returns>\n' +
          '   virtual EarthView::World::Spatial::GeoDataset::IDataset* openImpl(EarthView::World::Spatial::GeoDataset::IDataSource *parent, const EVString &name){\n' +
          '   return MyDataset(parent, name);\n' +
          '   }\n' +
          '   protected:\n' +
          '   /// <summary>\n' +
          '   /// 默认构造函数\n' +
          '   /// </summary>\n' +
          '   /// <returns></returns>\n' +
          '   MyDatasetFactory(): IDatasetFactory(MyDatasetType::DT_MyType(), "我的数据集类型", "我新扩展的一种数据集类型"){\n' +
          '   setCapability(DC_Create, true);\n' +
          '   setCapability(DC_Destroy, true);\n' +
          '   setCapability(DC_Open, true);\n' +
          '   }\n' +
          '   };\n' +
          '   //自动向系统注册这种新数据集工厂（在.cpp中添加代码）：\n' +
          '   class CMyDatasetFactoryRegistor{\n' +
          '   public:\n' +
          '   CMyDatasetFactoryRegistor (){\n' +
          '   IDataSourceFactory *dataSourceFactory = CDataSourceFactoryEnumerator::getSingletonPtr() ->getDataSourceFactory(MyDataSourceType::DST_MyType());\n' +
          '   if (dataSourceFactory){\n' +
          '   dataSourceFactory->getDatasetFactoryEnumerator()->addDatasetFactory(new MyDatasetFactory());\n' +
          '   }\n' +
          '   }\n' +
          '   ~ CMyDatasetFactoryRegistor (){\n' +
          '   IDataSourceFactory *dataSourceFactory = CDataSourceFactoryEnumerator::getSingletonPtr() ->getDataSourceFactory(MyDataSourceType::DST_MyType());\n' +
          '   if (dataSourceFactory){\n' +
          '   dataSourceFactory->getDatasetFactoryEnumerator()->removeDatasetFactory(MyDatasetType ::DT_MyType());\n' +
          '   }\n' +
          '   }\n' +
          '   };\n' +
          '   CMyDatasetFactoryRegistor gMyDatasetFactoryRegistor;\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '3. #### 数据库工厂\n' +
          '\n' +
          '   ```c++\n' +
          '   头文件： " spatialdatabase/databasefactory.h"\n' +
          '   命名空间：EarthView::World::Spatial::GeoDataset;\n' +
          '   类型： IDatabaseFactory\n' +
          '   举例：\n' +
          '   //获取指定类型的数据库工厂：\n' +
          '   IDatabaseFactory *factory = CDatabaseFactoryEnumerator::getSingletonPtr()->getDatabaseFactory();\n' +
          '   //创建数据库对象：\n' +
          '   CPropertySet info;\n' +
          '   info.setProperty(CDataBasePropertyKey::FullPath(), path + "sample.evd");\n' +
          '   info.setProperty(CDataBasePropertyKey::DatabaseName(), "sample.evd");\n' +
          '   info.setProperty(CDataBasePropertyKey::DatabaseType(), EVDatabaseType::SQLITE().Str);\n' +
          '   info.setProperty(CDataBasePropertyKey::Driver(), EVDatabaseType::SQLITE().Str);\n' +
          '   EarthView::World::Core::Database::CSqlDatabase = factory-> create(&info);\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '4. #### 场景工厂\n' +
          '\n' +
          '   ```c++\n' +
          '   头文件： "spatial3dengine/scenefactory.h"\n' +
          '   命名空间：EarthView::World::Spatial3D::Atlas;\n' +
          '   类型： CSceneFactory\n' +
          '   举例：\n' +
          '   //创建场景工厂对象\n' +
          '   ISceneFactory * factory = new CSceneFactory();\n' +
          '   //创建场景\n' +
          '   factory->newScene("我的场景", STT_WEBMERCATOR);\n' +
          '   //将场景工厂设置给工程文件管理器，这样就可以通过工程文件管理器的接口创建场景了。\n' +
          '   CProjectManager::getSingletonPtr()->setSceneFactory(factory);\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '5. #### 地图工厂\n' +
          '\n' +
          '   ```c++\n' +
          '   头文件： "spatial2datlas/mapfactory.h"\n' +
          '   命名空间：EarthView::World::Spatial2D::Atlas;\n' +
          '   类型： CMapFactory\n' +
          '   举例：\n' +
          '   //创建地图工厂对象\n' +
          '   IMapFactory * factory = new CMapFactory();\n' +
          '   //创建场景\n' +
          '   factory-> createMap ("我的地图");\n' +
          '   //将地图工厂设置给工程文件管理器，这样就可以通过工程文件管理器的接口创建地图了。\n' +
          '   CProjectManager::getSingletonPtr()->setMapFactory (factory);\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '6. #### 图层工厂\n' +
          '\n' +
          '   ```c++\n' +
          '   头文件： " spatialinterface/ilayer.h"\n' +
          '   命名空间：EarthView::World::Spatial::Atlas;\n' +
          '   类型： ILayerFactory\n' +
          '   举例：\n' +
          '   //从数据源工厂枚举可以获取到所有注册到系统中的数据源工厂对象：\n' +
          '   LayerFactoryList factories = CLayerFactoryEnumerator::getSingletonPtr()->getFactorys();\n' +
          '   //也可通过图层类型获取相应的图层工厂：\n' +
          '   ILayerFactory *factory=CLayerFactoryEnumerator::getSingletonPtr()->getLayerFactory (EVLayerType::LT_VECTOR_DATALAYER());\n' +
          '   扩展：\n' +
          '   class MyLayerFactory: public EarthView::World::Spatial::Atlas::ILayerFactory{\n' +
          '   public:\n' +
          '   MyLayerFactory(): ILayerFactory(EVLayerType::LT_MY_Layer(), "我的图层类型", "我扩展的新图层"){}\n' +
          '   ev_internal:\n' +
          '   /// <summary>\n' +
          '   /// 创建一个图层实例\n' +
          '   /// </summary>\n' +
          '   EarthView::World::Spatial::Atlas::ILayer* createInstance(){\n' +
          '   return new MyLayer();\n' +
          '   }\n' +
          '   };\n' +
          '   //自动向系统注册这种新图层工厂（在.cpp中添加代码）：\n' +
          '   class CMyLayerFactoryRegistor{\n' +
          '   public:\n' +
          '   CMyLayerFactoryRegistor (){\n' +
          '   CLayerFactoryEnumerator::getSingletonPtr()->addLayerFactory(new MyLayerFactory());\n' +
          '   }\n' +
          '   ~ CMyLayerFactoryRegistor (){\n' +
          '   CLayerFactoryEnumerator::getSingletonPtr()->removeLayerFactory(EVLayerType::LT_MY_Layer());\n' +
          '   }\n' +
          '   };\n' +
          '   CMyLayerFactoryRegistor gMyLayerFactoryRegistor;\n' +
          '   ```\n' +
          '\n' +
          '   \n' +
          '\n' +
          '\n',
      text6:'#### 工作空间的改变\n' +
          '\n' +
          '工作空间状态的改变主要包含：工程文件的改变（打开、关闭）；数据源的改变（添加、移除、更改）；地图、场景和布局的改变（添加、移除、更改）；数据集的改变（添加、移除、更改）；图层的改变（添加、移除、更改）。   \n' +
          '\n' +
          '通过向工程文件管理器注册IProjectManagerListener监听的方式，可以在工作空间状态改变时得到通知，从而有机会实现自己的业务逻辑（如更新树控件）。\n' +
          '\n' +
          '```c++\n' +
          '头文件： " spatialinterface/iprojectmanager.h"\n' +
          '命名空间：EarthView::World::Spatial::Utility;\n' +
          '类型： IProjectManager::IProjectManagerListener\n' +
          '扩展：\n' +
          'class CMyListener : public IProjectManager::IProjectManagerListener {\n' +
          'public:\n' +
          'CMyListener(MyWidget *widget): mParent(widget){}\n' +
          '~ CMyListener(){}\n' +
          'void onProjectFileLoaded(){\n' +
          '// update ui\n' +
          '}\n' +
          'void onDataSourceAdded(EarthView::World::Spatial::GeoDataset::IDataSource *datasource){\n' +
          '// update ui\n' +
          '}\n' +
          '...\n' +
          '};\n' +
          '// 在界面控件的初始化方法内注册监听，其中mListener是CMyListener *类型的成员变量\n' +
          'mListener = new CMyListener(this);\n' +
          'CProjectManager::getSingletonPtr()->addListener(mListener);\n' +
          '// 界面控件销毁前移除监听\n' +
          'CProjectManager::getSingletonPtr()->removeListener(mListener);\n' +
          'delete mListener;\n' +
          '```\n' +
          '\n' +
          '1. **工程文件改变**\n' +
          '\n' +
          '```c++\n' +
          'void onProjectFilePreLoaded();\n' +
          'void onProjectFileLoaded();\n' +
          'void onProjectLoadingProcessChanged(const EVString& tips,ev_uint8 percent);\n' +
          '```\n' +
          '\n' +
          '2. **数据源改变**\n' +
          '\n' +
          '```c++\n' +
          'void onDataSourceAdded(EarthView::World::Spatial::GeoDataset::IDataSource *datasource);\n' +
          'void onDataSourceRemoved(EarthView::World::Spatial::GeoDataset::IDataSource *datasource);\n' +
          'void onDataSourceChanged(EarthView::World::Spatial::GeoDataset::IDataSource *datasource);\n' +
          '```\n' +
          '\n' +
          '3. **地图改变**\n' +
          '\n' +
          '```c++\n' +
          'void onMapAdded(EarthView::World::Spatial::Atlas::IMap *map);\n' +
          'void onMapRemoved(EarthView::World::Spatial::Atlas::IMap *map);\n' +
          'void onMapChanged(EarthView::World::Spatial::Atlas::IMap *map);\n' +
          '```\n' +
          '\n' +
          '4. **场景改变**\n' +
          '\n' +
          '```c++\n' +
          'void onSceneAdded(EarthView::World::Spatial::Atlas::IScene *scene);\n' +
          'void onSceneRemoved(EarthView::World::Spatial::Atlas::IScene *scene);\n' +
          'void onSceneChanged(EarthView::World::Spatial::Atlas::IScene *scene);\n' +
          '```\n' +
          '\n' +
          '5. **布局改变**\n' +
          '\n' +
          '```c++\n' +
          'void onLayoutAdded(EarthView::World::Spatial::Carto::IPageLayout *layout);\n' +
          'void onLayoutRemoved(EarthView::World::Spatial::Carto::IPageLayout *layout);\n' +
          'void onLayoutChanged(EarthView::World::Spatial::Carto::IPageLayout *layout);\n' +
          '```\n' +
          '\n' +
          '6. **数据集改变**\n' +
          '\n' +
          '```c++\n' +
          'void onDatasetAdded(EarthView::World::Spatial::GeoDataset::IDataSource *datasource,EarthView::World::Spatial::GeoDataset::IDataMetaInfo *info);\n' +
          'virtual void onDatasetRemoved(EarthView::World::Spatial::GeoDataset::IDataSource *datasource, EarthView::World::Spatial::GeoDataset::IDataMetaInfo *info);\n' +
          'virtual void onDatasetChanged(EarthView::World::Spatial::GeoDataset::IDataSource *datasource, EarthView::World::Spatial::GeoDataset::IDataMetaInfo *info);\n' +
          '```\n' +
          '\n' +
          '7. .**图层改变**\n' +
          '\n' +
          '```c++\n' +
          'void onLayerAdded(EarthView::World::Spatial::Atlas::IMap *map, EarthView::World::Spatial::Atlas::IGroupLayer *parent, EarthView::World::Spatial::Atlas::ILayer *layer, ev_uint32 index){}\n' +
          'virtual void onLayerMoved(EarthView::World::Spatial::Atlas::IMap *map, EarthView::World::Spatial::Atlas::IGroupLayer *before, ev_uint32 indexbefore, EarthView::World::Spatial::Atlas::IGroupLayer *after, ev_uint32 indexafter, EarthView::World::Spatial::Atlas::ILayer *layer){}\n' +
          'virtual void onLayerAdded(EarthView::World::Spatial::Atlas::IScene *map, EarthView::World::Spatial::Atlas::ILayer *parent, EarthView::World::Spatial::Atlas::ILayer *layer, ev_uint32 index){}\n' +
          'virtual void onLayerRemoved(EarthView::World::Spatial::Atlas::IScene *map, EarthView::World::Spatial::Atlas::ILayer *parent, EarthView::World::Spatial::Atlas::ILayer *layer, ev_uint32 index){}\n' +
          'virtual void onLayerMoved(EarthView::World::Spatial::Atlas::IScene *map, EarthView::World::Spatial::Atlas::ILayer *before, ev_uint32 indexbefore, EarthView::World::Spatial::Atlas::ILayer *after, ev_uint32 indexafter,EarthView::World::Spatial::Atlas::ILayer *layer){}\n' +
          'virtual void onLayerChanged(EarthView::World::Spatial::Atlas::IMap *map, EarthView::World::Spatial::Atlas::IGroupLayer *parent, EarthView::World::Spatial::Atlas::ILayer *layer, ev_uint32 index){}\n' +
          'virtual void onLayerChanged(EarthView::World::Spatial::Atlas::IScene *scene, EarthView::World::Spatial::Atlas::ILayer *parent, EarthView::World::Spatial::Atlas::ILayer *layer, ev_uint32 index){}\n' +
          '```\n' +
          '\n' +
          '\n',
      text7:'',
    }
  }
}